<?php
define('TOKEN','wx2019');//定义token
$obj=new Weixin();//实例化函数
if(!isset($_GET['echostr'])){//如果随机字符串不存在
    $obj->receive();
}else{
    $obj->checkSignature();//调用函数中的方法
}

class Weixin{

        public function checkSignature()
    {
        $signature = $_GET["signature"];//加密签名
        $timestamp = $_GET["timestamp"];//时间戳
        $nonce = $_GET["nonce"];//随机数
        $token = TOKEN;
        $tmpArr = array($token,$timestamp, $nonce);//组成新数组
        sort($tmpArr, SORT_STRING);//重新排序
        $tmpStr = implode( $tmpArr );//转换成字符串
        $tmpStr = sha1( $tmpStr );//再将字符串加密

        if( $tmpStr==$signature ){
        echo $_GET['echostr'];
        }else{
        return false;
        }
    }
        public function receive(){
            $obj=$GLOBALS['HTTP_RAW_POST_DATA'];//接受消息
            $postSql=simplexml_load_string($obj,'SimpleXMLElement',LIBXML_NOCDATA);
            $this->logger("接受：\n".$obj);
            if(!empty($postSql)){
                switch(trim($postSql->MsgType)){
                    case "text":
                    $result=$this->receiveText($postSql);
                    if(!empty($result)){
                        echo $result;
                    }else{
                            $xml="<xml>
                        <ToUserName><![CDATA[%s]]></ToUserName>
                        <FromUserName><![CDATA[%s]]></FromUserName>
                        <CreateTime>%s</CreateTime>
                        <MsgType><![CDATA[%s]]></MsgType>
                        <Content><![CDATA[%s]]></Content>
                      </xml>";
                      
                      echo $result=sprintf($xml,$postSql->FromUserName,$postSql->ToUserName,time(),$postSql->MsgType,"没有这条文本信息(⊙o⊙)…");

                    }
                }
                
                
            }   
        }
        private function receiveText($postSql){
            $content=trim($postSql->Content);
            if(strstr($content,"你好")){//strstr模糊匹配strstr() 函数搜索字符串在另一字符串中是否存在，如果是，返回该字符串及剩余部分，否则返回 FALSE。
                $xml="<xml>
                        <ToUserName><![CDATA[%s]]></ToUserName>
                        <FromUserName><![CDATA[%s]]></FromUserName>
                        <CreateTime>%s</CreateTime>
                        <MsgType><![CDATA[%s]]></MsgType>
                        <Content><![CDATA[%s]]></Content>
                  </xml>";        
                $result=sprintf($xml,$postSql->FromUserName,$postSql->ToUserName,time(),$postSql->MsgType,"hello");
                    return $result;
            }else if(strstr($content,"单图文")){
                $result=$this->receiveImage($postSql);
                $this->logger("发送单图文消息：\n".$result);
                    return $result;
            }
            else if(strstr($content,"多图文")){
                $result=$this->receiveImages($postSql);
                $this->logger("发送多图文消息：\n".$result);
                    return $result;
            }
        
        }
        
        private function receiveImage($postSql){
            $xml = "<xml>
                        <ToUserName><![CDATA[%s]]></ToUserName>
                        <FromUserName><![CDATA[%s]]></FromUserName>
                        <CreateTime>%s</CreateTime>
                        <MsgType><![CDATA[%s]]></MsgType>
                        <ArticleCount>1</ArticleCount>
                        <Articles>
                        <item>
                        <Title><![CDATA[%s]]></Title> 
                        <Description><![CDATA[%s]]></Description>
                        <PicUrl><![CDATA[%s]]></PicUrl>
                        <Url><![CDATA[%s]]></Url>
                        </item>
                        <item>
                        </Articles></xml>";

                   
            $tempHead = "<xml>
                        <ToUserName><![CDATA[%s]]></ToUserName>
                        <FromUserName><![CDATA[%s]]></FromUserName>
                        <CreateTime>".time()."</CreateTime>
                        <MsgType><![CDATA[news]]></MsgType>
                        <ArticleCount>1</ArticleCount>
                        <Articles>";

            $temBody = "<item><Title><![CDATA[%s]]></Title> 
                        <Description><![CDATA[%s]]></Description>
                        <PicUrl><![CDATA[%s]]></PicUrl>
                        <Url><![CDATA[%s]]></Url></item>";
            
            $tempFoot = "</Articles></xml>"; 
            
            $record=array(
            'title' =>'山塘街',
            'description' =>'山塘街东起阊门渡僧桥，西至苏州名胜虎丘山的望山桥，长约七里，所以苏州俗语说“七里山塘到虎丘”...',
            'picUrl' => 'http://thinkshare.duapp.com/images/suzhou.jpg',
            'url' =>'http://mp.weixin.qq.com/mp/appmsg/show?__biz=MjM5NDM0NTEyMg==&appmsgid=10000046&itemidx=1&sign=9e7707d5615907d483df33ee449b378d#wechat_redirect'
            );
            $result=sprintf($xml,$postSql->FromUserName,$postSql->ToUserName,time(),"news","zhangyouwu的微信开发","微信开发其实很简单","http://pic.baike.soso.com/ugc/baikepic2/5494/20170825195528-1233831972_jpg_387_310_14279.jpg/0","http://www.baidu.com");
            return $result; 
        }
        //多图文，最多8条
        private function receiveImages($postSql){
            $content=array();
            $content[]=array("Title"=>"zhangyouwu的微信开发","Description"=>"微信开发其实很简单","PicUrl"=>"http://pic.baike.soso.com/ugc/baikepic2/5494/20170825195528-1233831972_jpg_387_310_14279.jpg/0","Url"=>"http://www.baidu.com");
            $content[]=array("Title"=>"zhangyouwu的微信开发","Description"=>"微信开发其实很简单","PicUrl"=>"http://pic.baike.soso.com/ugc/baikepic2/5494/20170825195528-1233831972_jpg_387_310_14279.jpg/0","Url"=>"http://www.baidu.com");
            $content[]=array("Title"=>"zhangyouwu的微信开发","Description"=>"微信开发其实很简单","PicUrl"=>"http://pic.baike.soso.com/ugc/baikepic2/5494/20170825195528-1233831972_jpg_387_310_14279.jpg/0","Url"=>"http://www.baidu.com");
            $content[]=array("Title"=>"zhangyouwu的微信开发","Description"=>"微信开发其实很简单","PicUrl"=>"http://pic.baike.soso.com/ugc/baikepic2/5494/20170825195528-1233831972_jpg_387_310_14279.jpg/0","Url"=>"http://www.baidu.com");
    
            
            
            $str="<item>
            <Title><![CDATA[%s]]></Title> 
            <Description><![CDATA[%s]]></Description>
            <PicUrl><![CDATA[%s]]></PicUrl>
            <Url><![CDATA[%s]]></Url></item>";
            $news="";
            foreach($content as $newArray){
                $news.=sprintf($str,$newArray['Title'],$newArray['Description'],$newArray['PicUrl'],$newArray['Url']);
                }
            $xml="<xml>
            <ToUserName><![CDATA[%s]]></ToUserName>
            <FromUserName><![CDATA[%s]]></FromUserName>
            <CreateTime>%s</CreateTime>
            <MsgType><![CDATA[%s]]></MsgType>
            <ArticleCount>%s</ArticleCount>
            <Articles>
            $news
            
            </Articles></xml>";
            $result=sprintf($xml,$postSql->FromUserName,$postSql->ToUserName,time(),"news",count($content));
            return $result; 
            
            }
        
        private function logger($content){//存储日志
            $logSize=100000;//定义日志大小
            $log="log.txt";//定义日志名字
            if(file_exists($log)&&filesize($log)>$logSize){//如果日志存在并且大于定义的大小
                unlink($log);//删除
            }
            //文件写入1.名字2.内容，+时间防止重复3.内容往后加而不是覆盖
            file_put_contents($log,date('H:i:s')." ".$content."\n",FILE_APPEND);
        }
}

?>